﻿namespace ConsoleApp2
{
    //1 泛型约束
    /*l class : 泛型T必须是引用类型
      2 struct: 泛型T必须是值类型
      3 new():泛型T必须是包含一个无参构造方法的class,如果同时有其他约束，new()必须放在最后
      4 类名(Person):泛型T要么就是Person类型，要么是Person的子类/孙子类。
      5 接口约束:泛型T必须实现一个或多个接口
      6 多占位符约束:使用where关键字对多个占位符进行各自约束 */


    //1 class 引用类型
    class GenericClass1<T> where T : class
    {

    }

    //2 struct 值类型
    class GenericClass2<T> where T:struct 
    {
        
    }

    //3 new () 当前的T，必须包含无参构造方法

    class test
    {
        public test() { }
    }
    class GenericClass3<T> where T : new()
    {

    }

    //4 类名(Person)
    class Person
    {

    }
    class student:Person
    {

    }
    class GenericClass4<T> where T : Person
    {

    }

    //5 接口约束
    interface IFireable
    {
        void Fire();
    }
    interface IRunnbale
    {
        void Run();
    }
    class Tank : IFireable, IRunnbale
    {
        public void Fire()
        { 
        }

        public void Run()
        {
        }
    }
    class GenericClass5<T> where T : IFireable
    {

    }

    //6 多类型占位符
    class GenericClass6<T,B> where T : class where B : IFireable
    {

    }



    internal class Program
    {
        static void Main(string[] args)
        {
            //1 class 引用类型
            GenericClass1<string> genericClass1 = new GenericClass1<string>();
            //2 struct 值类型
            GenericClass2<int> genericClass2 = new GenericClass2<int>();
            //3 new () 当前的T，必须包含无参构造方法
            GenericClass3<test> genericClass3 = new GenericClass3<test>();
            //4 类名(Person)
            GenericClass4<Person> genericClass4 = new GenericClass4<Person>();
            GenericClass4<student> genericClass44 = new GenericClass4<student>();
            //5 接口约束
            GenericClass5<IFireable> genericClass5 = new GenericClass5<IFireable>();
            GenericClass5<Tank> genericClass55 = new GenericClass5<Tank>();
            //6 多类型占位符
            GenericClass6<string,Tank> genericClass6 = new GenericClass6<string, Tank>();
        }
    }



}